package com.itany.corejava.code10_异常;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月22日 16:36
 */
public class Test02_异常处理 {
    public static void main(String[] args) throws ParseException, ClassNotFoundException {
        // test01();

        // 当调用test02，由于该方法存在未处理的异常
        // 因此此时需要对异常进行处理
        // 此时由于throws ParseException，最终会交到JVM中进行处理
        test02("2023-11-12");

        // test03(10,0);
    }


    /**
     *  使用try-catch-finally语句处理异常
     */

    public static void test01(){

        // try是必须要的，catch和finally至少要有一个

        try{//将可能出现异常的代码放在try里面
            int i=10/2;
            return;

        }catch(ArithmeticException e){//捕获异常，异常对象
            // System.out.println("您的计算出问题啦");
            // System.out.println(e);
            //异常对象中包含了异常的详细信息
            System.out.println(e.getMessage());

            // 打印堆栈中异常详细信息
            // e.printStackTrace();


        }finally {//无论是否存在异常，此代码都会执行
            System.out.println("无论是否存在异常都必须执行的代码");
        }

        System.out.println("异常之后的代码");
    }

    public static void test02(String s) throws ParseException, ClassNotFoundException {
        // 方式一:通过catch捕获到指定异常之后再抛出去
        try{
            Date date=new SimpleDateFormat("yyyy-MM-dd").parse(s);
        }catch (ParseException e){
            // 此处表示捕获到对应的异常，可以进行处理
            // System.out.println("解析失败："+s+"格式有误");

            //此处也可以使用throw关键字将异常抛出去，不进行处理
            // throw后面是异常对象，通过new 异常对象()创建对应的异常对象
            //此时抛出异常，方法的声明中需要添加throws异常类型表示当前方法抛出去的异常

            throw e;
        }

        //方式二:直接使用throws声明抛出异常，不进行捕获
        // Class.forName("java.lang.Test");

    }

    public static int test03(int num1,int num2) throws Exception {
        //如果num2的值为0，会存在异常
        //开发者需要对这种情况进行处理
        if(num2==0){
            //如果num2的值为0，会存在异常
            // 此时可以不用try-catch-finally来捕获
            // 异常构造方法的参数可以指定异常信息
            // ArithmeticException e=new ArithmeticException("第二个参数的值不能为0");
            // throw e;


            // 简写方式，对于运行时异常，方法声明中不需要通过throws声明，此时的方法处没有throws
            // throw new ArithmeticException("第二个参数的值不能为0");


            //对于检查异常，方法必须声明
            // throw相当于return，表示代码结束
            throw new Exception("这是检查异常");


    }
        return num1/num2;
    }

}
